package contatos.presenter;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.IOException;
import java.util.Collection;
import javax.swing.JFileChooser;
import javax.swing.JOptionPane;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
import contatos.collection.Contatos;
import contatos.model.Contato;
import contatos.view.ProgressBarView;

/**
 *
 * @author felipe
 */
public class ImportaContatoXMLPresenter {

    private ProgressBarView view;

    public ImportaContatoXMLPresenter() {

        view = new ProgressBarView();
        view.getBtnFechar().setEnabled(false);
        view.getProgressBar().setStringPainted(true);

        view.getBtnFechar().addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                view.setVisible(false);
                view.dispose();
            }
        });

        final JFileChooser fc = new JFileChooser();
        int returnVal = fc.showOpenDialog(view);
        if (returnVal == JFileChooser.APPROVE_OPTION) {
            String caminhoArquivo = fc.getSelectedFile().getAbsolutePath();
            try {
                view.setVisible(true);
                Contatos pessoas = Contatos.getInstancia();
                importaXML(caminhoArquivo, pessoas.getTreeSet());
                pessoas.Persistir(true);
            } catch (Exception ex) {
                JOptionPane.showMessageDialog(view, ex.getMessage());
            }
        }
    }

    /**
     * Esse método permite a importação de um arquivo de contatos em XML no
     * seguinte padrão:
     * <pre>
     * {@code
     * <contatos>
     *   <contato>
     *       <Id>1</Id>
     *       <Nome>Madeline Mullins</Nome>
     *       <Telefone>(22) 9689-2958</Telefone>
     *   </contato>
     * </contatos>
     * }
     * </pre>
     *
     * @param caminhoArquivo Caminho do arquivo selecionado
     * @param colecao Colecao de pessoas que recebera os dados do XML
     * @throws javax.xml.parsers.ParserConfigurationException
     * @throws org.xml.sax.SAXException
     * @throws java.io.IOException
     *
     */
    private void importaXML(String caminhoArquivo, Collection colecao) throws ParserConfigurationException, SAXException, IOException {

        //Get Document Builder
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        DocumentBuilder builder = factory.newDocumentBuilder();

        //Build Document
        org.w3c.dom.Document document = builder.parse(new File(caminhoArquivo));

        //Normalize the XML Structure; It's just too important !!
        document.getDocumentElement().normalize();

        //Get all contacts
        NodeList nList = document.getElementsByTagName("contato");
        for (int i = 0; i < nList.getLength(); i++) {
            Node node = nList.item(i);
            if (node.getNodeType() == Node.ELEMENT_NODE) {
                Element eElement = (Element) node;
                String nome = eElement.getElementsByTagName("Nome").item(0).getTextContent();
                String telefone = eElement.getElementsByTagName("Telefone").item(0).getTextContent().replace(" ", "");
                boolean add = colecao.add(new Contato(nome, telefone.trim(), "", ""));

                int porcentagem = i * 100 / nList.getLength();
                view.getProgressBar().setValue(porcentagem);
                if (add) {
                    view.getTxtAreaProgress().append("Contato " + nome + " importado com sucesso!\n");
                } else {
                    view.getTxtAreaProgress().append("Contato " + nome + " não importado, número já existente: " + telefone + "\n");
                }
            }
        }

        view.getProgressBar().setValue(100);
        view.getBtnFechar().setEnabled(true);
    }
}
